package com.hedl.practice.diyJava.gather.study_iterator.test;


import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Iterator是一种抽象的数据访问模型。使用Iterator模式进行迭代的好处有：
 *      对任何集合都采用同一种访问模型;
 *      调用者对集合内部结构一无所知;
 *      集合类返回的Iterator对象知道如何迭代;
 * Java提供了标准的迭代器模型，即集合类实现java.util.Iterable接口，返回java.util.Iterator实例;
 */
public class Main {
    public static void main(String[] args) {
        ReverseList<String> rlist = new ReverseList<>();

        rlist.add("Apple");
        rlist.add("Orange");
        rlist.add("Pear");

        for (String s : rlist) {
            System.out.println(s);
        }
    }
}

/**
 * 在编写Iterator的时候，我们通常可以用一个内部类来实现Iterator接口，这个内部类可以直接访问对应的外部类的所有字段和方法。
 *      例如，上述代码中，内部类ReverseIterator可以用ReverseList.this获得当前外部类的this引用，
 *      然后，通过这个this引用就可以访问ReverseList的所有字段和方法。
 * @param <T>
 */

/**
 * for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
 *      String s = it.next();
 *      System.out.println(s);
 * }
 * @param <T>
 */
class ReverseList<T> implements Iterable<T>{

    private List<T> list = new ArrayList<>();

    public void add(T t){
        list.add(t);
    }

    @Override       //获取集合大小
    public Iterator<T> iterator() {
        return new ReverseIterator(list.size());
    }
    class ReverseIterator implements Iterator<T> {
        int index;

        ReverseIterator(int index) {
            this.index = index;
        }

        @Override       //集合做判断
        public boolean hasNext() {
            return index > 0;
        }

        @Override       //集合自减
        public T next() {
            index--;
            return ReverseList.this.list.get(index);
        }
    }

}
